MySQL 编码问题
1. 问题表现
向以 utf8 为编码方式的 MariaDB 中存入一个 UTF-8 字符串,出现了一个错误:
Incorrect string value: ‘\xF0\x9F\x98\x83 <…’ for column ‘summary’ at row 1
目前已知,客户端和服务端都使用 UTF-8 编码,要保存的字符串也是合法的 UTF-8 编码。
2. 问题所在
MySQL 的 utf8 实际上不是真正的 UTF-8。
标准 UTF-8 编码方式以 8 位为一个最小编码单位,进行总长可变的编码,将一个 Unicode 码位编码为 1 到 4 个字节。
而 utf8 编码长度最长为三个字节。
这个 bug 一直保留了下来,MySQL 维护组在 2010 年发布了 utf8mb4 的字符集,绕过了这个问题。
然而,他们并没有把加入新字符集这个操作通知到大部分的开发者。
简单概括如下:
- MySQL 的 utf8mb4 是真正的 UTF-8。
- MySQL 的 utf8 是一种专属的编码,它能够编码的 Unicode 字符并不多。
所有在使用 utf8 的 MySQL 和 MariaDB 用户都应该改用 utf8mb4 ,永远不要使用 utf8。
MySQL 的 utf8 字符集与其他程序不兼容。